查看原文
其他

但愿人长久,搬砖不再有

Android轮子哥 鸿洋 2019-04-05

本文作者


作者:Android轮子哥

链接:

https://www.jianshu.com/p/77dd326f21dc

本文由作者授权发布。


一次意外的水群,看到作者在群里介绍他的新项目,了解一下,特意请求作者写了篇文章。


本文的意义并不是让大家使用这样的一个开源库,而且希望大家可以借鉴作者项目,结合自己多年的开发经验,可以做同样的事情,提成开发效率,节省时间,就可以多上wanandroid 学习了。


1概述


在做过了N个公司项目开发的时候,我常常在怀疑人生,为什么大部分时间都浪费在搬砖的事情上,每开始一个新项目这个念头更是涌上心头,终于在经历了那么多项目开发后,我做出了一件常人都不太愿意去做的事:


搭架构和做模板


经过对每个做过的项目进行分析,把其中的共同点抽取并且分离开来,历时一个多月,经过不断地修改,不断地修改,不断地修改......


在今天,正式开源了,这个项目几乎适用于任何新项目的开发,可以帮你节省很多时间和精力,同时能让你避开常见的坑 ,规范和统一新项目的代码,避免了开发代码混乱的问题

我相信这个项目会造福很多人,特别是和我一样做外包项目的开发者,你们将解放你们的双手。


https://github.com/getActivity/AndroidProject


2项目模板组成


  1. APP用户体验:已经集成界面侧滑以及状态栏沉浸框架

  2. 必备优秀框架:危险权限处理,标题栏控件,吐司工具类,圆形ImageView

  3. 常用页面模板:启动界面,主页界面,登录界面,注册界面,关于界面,浏览器界面

  4. 集成友盟统计:集成友盟统计,并且加入了友盟多渠道打包,在发布release包时可选择渠道包

  5. 界面样式规范:项目的严格按照 Material Design 设计进行配色,统一和规范Button和EditText控件样式

  6. 常用自定义View:圆形ImageView,验证码点击倒计时View,带清除按钮的EditText,正方形的FrameLayout、LinearLayout、RelativeLayout、ImageView

  7. 代码注释规范:代码严格按照谷歌级规范来做,如需寻找友盟相关的代码,全局搜索 "友盟" 即可,任何一处不关于原生的 API 都有非常完善的注释


3修复Android普遍存在的问题


  • 修复 Button 在Android 5.1 之后英文字符串自动大写的问题

  • 修复 Button 在设置状态选择器后仍然残留按压阴影的问题

  • 修复某些低配置机型启动页停留在白屏的时间比较长的问题

  • 修复某些机型在 WebView 长按时布局被顶下来的问题

  • 修复 任务栈中 首页Activity 被重复启动的问题

  • 修正 Android 9.0 限制 Http 明文请求的问题


这些问题已经在模板项目中已经被修复好了,具体修复过程如下


修复 Button 在Android 5.1 之后英文字符串自动大写的问题


给 Button 添加如下属性即可,模板工程已经把该属性封装到Style中,直接引用style="@style/ButtonStyle"即可


android:textAllCaps="false"


修复 Button 在设置状态选择器后仍然残留按压阴影的问题


给 Button 设置样式如下即可,模板工程已经把该属性封装到Style中,直接引用style="@style/ButtonStyle"即可


style="Widget.AppCompat.Button.Borderless"


修复某些低配置机型启动页停留在白屏的时间比较长的问题


某些低配置机型上出现该问题比较明显,如果配置好的机型则看不出来,添加一个透明的Activity主题样式


<!-- 解决启动页白屏的问题 -->
<style name="LauncherTheme" parent="AppTheme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>


在清单文件中给启动页的Activity设置主题样式


<!-- 启动页面(因为使用了LauncherTheme,所以不要给这个Activity设置screenOrientation属性,会导致崩溃) -->
<activity
    android:name=".ui.activity.LauncherActivity"
    android:theme="@style/LauncherTheme">


    <!-- 程序入口 -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

</activity>


还有一点需要特别注意,Android 8.0 及之后不允许透明主题的Activity设置屏幕方向,所以请不要给Activity设置该属性,否则会导致崩溃


修复某些机型在 WebView 长按时布局被顶下来的问题


这个问题在只要界面有 WebView 的情况才会发生,在 Android 5.1 经过测试,在 WebView 中长按选择复制文字时,会显示一个类似于 Actionbar 的控件,但是这个东西叫做ActionMode,会将当前 Activity 所在布局顶下去,这时会和我们项目中的标题栏出现冲突,类似于一个界面同时出现了两个标题栏的效果。


解决的方法很简单,就是让出现的 ActionMode 悬浮在 Activity上,这样就把项目中的标题栏遮挡住了,不会出现那种类似一个界面出现两种标题栏的效果,当 WebView 取消长按复制文字后,ActionMode也会随之消失


如何让 ActionMode 悬浮在 Activity 上呢?


其实很简单,在 Application 主题中加入以下属性


<!--  ActionMode覆盖Actionbar,不顶下来 -->
<item name="windowActionModeOverlay">true</item>
<item name="android:windowContentOverlay">@null</item>
<!--  ActionMode的颜色 -->
<item name="actionModeBackground">@color/colorPrimary</item>


修复 任务栈中 首页Activity 被重复启动的问题


这个问题导致是因为LauncherActivity作为APP的第一个界面,销毁后没有保存任务栈的状态,导致我们在桌面上启动的时候系统误认为当前启动LauncherActivity的任务栈已经被销毁,所以重新创建了新的任务栈并且跳转到LauncherActivity,最终导致用户从桌面点击APP图标时,总是跳转到LauncherActivity而不是HomeActivity


<!-- 主页界面 -->
<activity
    android:name=".ui.activity.HomeActivity"
    android:alwaysRetainTaskState="true"
    android:launchMode="singleTop" />


修复 Android P 限制 Http 明文请求的问题


Android P 限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉。 如果当前应用的请求是 htttp 请求,而非 https ,这样就会导系统禁止当前应用进行该请求,如果 WebView 的 url 用 http 协议,同样会出现加载失败,https 不受影响。


在 res 下新建一个 xml 目录,然后创建一个名为:network_security_config.xml 文件 ,该文件内容如下


<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>


然后在 AndroidManifest.xml application 标签内应用上面的xml配置


<application
    android:name=".App"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:networkSecurityConfig="@xml/network_security_config"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:theme="@style/AppTheme" />



4效果总图


点击此处下载APP进行体验



集成框架


  • 权限请求框架:https://github.com/getActivity/XXPermissions

  • 标题栏:https://github.com/getActivity/TitleBar

  • 吐司工具类:https://github.com/getActivity/ToastUtils

  • 状态栏沉浸:https://github.com/gyf-dev/ImmersionBar

  • 界面侧滑功能:https://github.com/bingoogolapple/BGASwipeBackLayout-Android

  • 圆形ImageView:https://github.com/hdodenhof/CircleImageView

  • ButterKnife注解:https://github.com/JakeWharton/butterknife


项目地址:

https://github.com/getActivity/AndroidProject


我觉得每个人都可以做这样的事情,结合自己多年的经验,修复常见的问题,抽取各种基类,解耦的方式集成常用第三方库,做事件总线、组件化、打包脚本等,然后不带的迭代补充与完善...


下面有一些设计方面的文章也可以帮助你完成上述的事情:


如何封装个好用的高斯模糊组件

PageLayout状态页切换 加载中-空数据-错误页

优雅地实现Android主流图片加载框架封装,可无侵入切换框架

封装并实现统一的图片加载架构

高级MVP架构封装演变全过程

从BaseActivity与BaseFragment的封装谈起

Android 快速开发(一),封装一个 TopBarBaseActivity

Android 快速开发(二),封装一个 BottomTabBaseActivity

Retrofit--合理封装回调能让你的项目高逼格

我一行代码都不写实现Toolbar!你却还在封装BaseActivity?



扫一扫 关注我的公众号

如果你想要跟大家分享你的文章,欢迎投稿~


┏(^0^)┛明天见!


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存